package com.AdvancedDemos.LearnThread多线程;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class 线程池基本操作 {
    public static void main(String[] args) {
        /**
         * 线程池基本操作
         *
         * JDK5.0起提供了代表线程池的接口ExecutorService
         *
         * 如何得到线程池对象?
         *
         * 方式一:使用ExecutorService接口的实现类ThreadPoolExecutor创建一个线程池对象
         * 方式二:使用线程池工具类Executors调用方法返回不同特点的线程池对象
         *
         */

        /**
         ThreadPoolExecutor七参构造器
         public ThreadPoolExecutor(
         int corePoolSize，参数一:corePoolSize --- 指定线程池的核心线程的数量,即可以长久服务的线程的数量
         int maximumPoolSize，参数二:maximumPoolSize --- 指定线程池的最大线程数量,通常大于核心线程的数量,多余的部分为临时线程
         long keepAliveTime，参数三:keepAliveTime --- 指定临时线程的存活时间
         TimeUnit unit,参数四:unit --- 指定临时线程存活的时间单位(秒,分,时,天)
         BlockingQueue<Runnable> workQueue，参数五:workQueue --- 指定线程池的任务队列,任务队列用于缓存任务,排队等待线程来处理任务
         ThreadFactory threadFactory,参数六:threadFactory --- 指定线程池的线程工厂
         RejectedExecutionHandler handler)参数七:handler --- 指定线程池的任务拒绝策略,例如线程都在忙,任务队列也满了的时候,新来的任务该怎么处理

         */
        //创建有3个线程的线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(3);

        //交给线程池任务执行
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName() + ":打印:" + i);
                }
            }
        };

        //提交线程池任务
        threadPool.submit(runnable);
        threadPool.submit(runnable);
        threadPool.submit(runnable);
        threadPool.submit(runnable);

        //关闭线程池
        threadPool.shutdown();
    }
}
